#include "OpencvUtils.h"

cv::Mat QPixmapToCvMat(const QPixmap &pixmap) {
    // QPixmap -> QImage
    QImage img = pixmap.toImage().convertToFormat(QImage::Format_RGB888);
    // QImage -> cv::Mat，注意 const_cast
    cv::Mat mat(img.height(), img.width(), CV_8UC3, const_cast<uchar*>(img.bits()), img.bytesPerLine());
    // clone() 保证返回 Mat 数据独立
    cv::Mat matCopy = mat.clone();
    // RGB -> BGR，OpenCV 默认使用 BGR
    cv::cvtColor(matCopy, matCopy, cv::COLOR_RGB2BGR);
    return matCopy;
}

QPixmap CvMatToQPixmap(const cv::Mat &mat) {
    cv::Mat rgb;
    if(mat.channels() == 1) {
        // 灰度图 -> RGB
        cv::cvtColor(mat, rgb, cv::COLOR_GRAY2RGB);
    } else {
        // BGR -> RGB
        cv::cvtColor(mat, rgb, cv::COLOR_BGR2RGB);
    }
    // cv::Mat -> QImage -> QPixmap
    return QPixmap::fromImage(
            QImage(
                    (const uchar*)rgb.data, // 图像数据指针
                    rgb.cols,               // 宽度
                    rgb.rows,               // 高度
                    rgb.step,               // 每行字节数（行跨度）
                    QImage::Format_RGB888   // 格式
            )
    );
}
